package game_logic.model;


import game_logic.GameStatus;
import game_logic.util.Utils;

import javax.swing.*;

/**
 * 棋盘类，含有许多棋子
 */
public class Board implements GameStatus {
    /**
     * 查询指定位置的棋子
     *
     * @param x 横坐标
     * @param y 纵坐标
     * @return 指定位置的棋子
     */
    public Piece getPiece(int x, int y) {
        return pieces[x][y];
    }

    /**
     * 将指定棋子放在指定位置
     *
     * @param x     横坐标
     * @param y     纵坐标
     * @param piece 指定棋子
     */
    public void setPiece(int x, int y, Piece piece) {
        pieces[x][y] = piece;
    }

    /**
     * 尝试将指定棋子放在指定位置，如果之前存在棋子，那么不做任何操作。返回这个位置之前的棋子，如果之前没有棋子那么返回 null。
     *
     * @param x     横坐标
     * @param y     纵坐标
     * @param piece 指定棋子
     * @return 这个位置之前的棋子
     */
    public Piece putPieceIfAbsent(int x, int y, Piece piece) {
        if (pieces[x][y] != null) return pieces[x][y];
        pieces[x][y] = piece;
        return null;
    }

    /**
     * 当前棋盘棋子个数
     * @return pieces size
     */
    public int getPieceSize(){
        int count = 0;
        for (int x = 0; x < 9; ++x) {
            for (int y = 0; y < 10; ++y) {
                Piece piece = this.getPiece(x, y);
                if (piece == null) continue; // 如果没有棋子，那么跳过
                count++;
            }
        }
        return count;
    }


    @Override
    public boolean isCheckmate() {
        return this.isCheckmate;
    }

    @Override
    public boolean isStalemate() {
        return this.isStalemate;
    }

    @Override
    public boolean isGameOver() {
        return this.isGameOver;
    }

    @Override
    public Integer getCurrentPlayer() {
        return this.currentPlayer;
    }

    @Override
    public Integer getWinner() {
        return this.winner;
    }


    /**
     * 构造函数
     */
    public Board() {
    }

    public final int BOARD_WIDTH = 9, BOARD_HEIGHT = 10;
    private final Piece[][] pieces = new Piece[BOARD_WIDTH][BOARD_HEIGHT]; // 棋盘
    private Boolean isCheckmate; // 将军
    private Boolean isStalemate; // 和棋
    private Boolean isGameOver; // 结束
    private Integer currentPlayer; // 当前回合玩家
    private Integer winner = null; // 游戏胜利者

    public void setCheckmate(boolean checkmate) {
        isCheckmate = checkmate;
    }

    public void setStalemate(boolean stalemate) {
        isStalemate = stalemate;
    }

    public void setGameOver(boolean gameOver) {
        isGameOver = gameOver;
    }

    public void setCurrentPlayer(Integer currentPlayer) {
        this.currentPlayer = currentPlayer;
    }

    public void setWinner(Integer winner) {
        if (!this.isGameOver()) throw new UnknownError("游戏未结束，但是设置了胜利者");
        this.winner = winner;
    }
}
